<?php
  
/**
 * License.php
 *
 * Класс для проверки лицензии
 *
 * @author Игорь Будасов aka Lord <igor.budasov@gmail.com>
 * @copyright Игорь Будасов aka Lord <igor.budasov@gmail.com>
 */
 
class License 
{
    // домен, для которого устанавливаем лицензию
    private $domain = '';
    // емэйл, на который будут уходить заказы
    private $email = '';
    // время установки лицензии
    private $startTime = 0;
    // время в днях, после которого тестовый период окончится
    private $expireTime = 0; 
    // секретное слово
    private $secretWord = '';
    
/*------------------------------------------------------------------------------*/

    public function __construct() 
    {
        $this->setStartTime(time());
        $this->setExpireTime( 7 );
        $this->setSecretWord('ichojja');
        $this->setDomain($_SERVER['HTTP_HOST']);
        $this->setEmail('info@' . $_SERVER['HTTP_HOST']);
    }

/*------------------------------------------------------------------------------*/

    /**
    * Тут мы собираем данные о лицензии и шифруем многими разными способами
    * и пишем в файл лицензии
    * 
    * @return string $license
    */

    public function set($email = '', $domain = '', $timeExpire = '',  $timeStart = '')
    {    
        $email       = $this->setEmail($email);
        $domain      = $this->setDomain($domain);
        $timeStart   = $this->setStartTime($timeStart);
        $timeExpire  = $this->setExpireTime($timeExpire);
                              
        $license = array(
                         'domain'     => $this->domain,
                         'email'      => $this->email,
                         'timeStart'  => $this->startTime,
                         'timeExpire' => $this->expireTime,
                         'word'       => $this->secretWord
                         );
                         
        $licenseString = base64_encode(serialize($license));
           
        $fp = fopen('license', 'w+');
        fwrite($fp, $licenseString);
        fclose($fp);
        
        return ;
    }
    
/*------------------------------------------------------------------------------*/

    /**
    * Затираем лицензию нерабочей версией лицензии
    * 
    * @return string $license
    */

    public function delete()
    {    
        $license = array(
                         'domain'     => 'localhost',
                         'email'      => 'invalid.license@domain.com',
                         'timeStart'  => time() + 1000,
                         'timeExpire' => time() - 10000,
                         'word'       => 'INVALID_LICENSE'
                         );
                         
        $licenseString = base64_encode(serialize($license));
           
        $fp = fopen('../../license', 'w+');
        fwrite($fp, $licenseString);
        fclose($fp);
        
        return ;
    }
    
/*------------------------------------------------------------------------------*/

    /**
    * Этот метод проверяет лицензию
    * 
    * @return true | false
    */

    public function check(  )
    {
        /**
        * @todo проверка числа
        * @todo проверка бомбы, отправлять ли уведомление
        */
        
        // зачитываем текущий файл лицензии
        $filename = "license";
        $handle = @fopen($filename, "r");
        if(!$handle) return false;
        $licenseString = fread($handle, filesize($filename));
        fclose($handle);
              
        // распакуем лицензию         
        $license = unserialize(base64_decode($licenseString));
              
        $domain = $this->checkDomain($license['domain']);
        $time = $this->checkTime($license);
             
        if(!$domain or !$time) return false;
        else return true;
    }
    
/*------------------------------------------------------------------------------*/    

    /**
    * Функция для установки домена, в пределах которого действует лицензия
    *                
    * @return array $domain
    */

    public function setDomain( $domain = '')
    {
        $this->domain = (empty($domain)) ? $_SERVER['SERVER_NAME'] : $domain;
        return $this->domain;
    }
    
/*------------------------------------------------------------------------------*/    

    /**
    * Функция для установки основного имэйла магазина.
    * Сделана для пущей безопасности, чтоб привязываться не только к домену
    * 
    * @param string $email
    * @return string $email
    */

    public function setEmail( $email = '' )
    {
        $this->email = (empty($email)) ? 'info@' . $_SERVER['HTTP_HOST'] : $email;
        return $this->email;
    }
    
/*------------------------------------------------------------------------------*/    

    /**
    * Функция для установки секретного слова для раскодировки лицензии
    * 
    * @param string $word
    * @return string $word
    */

    public function setSecretWord( $word = '' )
    {
        $this->secretWord = (empty($word)) ? 'ichojja' : $word;
        return $this->secretWord;
    }
    
/*------------------------------------------------------------------------------*/    

    /**
    * Функция для установки времени ачала действия лицензии
    * 
    * @param string $time время в секундах до истечения
    * @return string $time дата отключения движка
    */

    public function setStartTime( $time = '' )
    {
        $this->startTime = (empty($time)) ? time() : $time;
        return $this->startTime;
    }
    
/*------------------------------------------------------------------------------*/    

    /**
    * Функция для установки времени тестирования магазина
    * 
    * @param int $days
    * @return int $timeStamp
    */

    public function setExpireTime( $days = 7 )
    {     
        $days = intval($days);  
        $this->expireTime = (!empty($days)) ? time() + ($days * 24 * 60 * 60) : false;
        return $this->expireTime;
    }
    
/*------------------------------------------------------------------------------*/

    /**
    * Функция для проверки числа, установленного другой функцией 
    * и сверки ее с переменной
    * 
    * @return true | false
    */

    public function checkNum()
    {
    }
    
/*------------------------------------------------------------------------------*/

    /**
    * Функция для проверки времени действия лицензии
    * 
    * @param array $license
    * @return true | false
    */

    public function checkTime($license)
    {
        $result = '';
        $timeStart   = $license['timeStart'];
        $timeCurrent = time();   
        $timeEnd     = $license['timeExpire'];
            
        
        
              
        if($timeStart > $timeCurrent) return false;    
        elseif($timeEnd < $timeCurrent) return false;
        elseif($timeEnd < $timeStart)return false;
        
        return true;
    }
    
/*------------------------------------------------------------------------------*/

    /**
    * Функция для проверки текущего домена
    * 
    * @param string $domain
    * @return string $domain
    */

    public function checkDomain( $domain = '' )
    {   
        if(getenv("HTTP_HOST") != $_SERVER['HTTP_HOST']) return false;
        
        $domains = explode(',', $domain);
        $result  = array();
        foreach($domains as $dmn)
        {
            if($dmn == getenv("HTTP_HOST") or $dmn == $_SERVER['HTTP_HOST'])
            {
                $result[$dmn] = 1;
            }
        }
        
        $found = array_search(1, $result);
        if($found != null) return true;
        else return false;
          
    }
    
/*------------------------------------------------------------------------------*/    

    /**
    * Функция, для отсылки уведомления, если база заполнена на 100 и больше 
    * товаров
    * 
    * @return true | false
    */

    public function checkTimebomb()
    {
    }
    
/*------------------------------------------------------------------------------*/    
}

/**
* Удалить лицензию можно сходив по адресу
* http://domain.com/application/system/License.php?delete
*/

$license = new License();  
if(isset($_GET['delete'])) $license->delete();

?>
